home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Utilities / Magnify / Source / Magnify.m < prev    next >
Text File  |  1992-12-04  |  6KB  |  255 lines

  1. /* File: Magnify.m - Application class for 'Magnify'
  2.  *
  3.  * By: Christopher Lane
  4.  * Symbolic Systems Resources Group
  5.  * Knowledge Systems Laboratory
  6.  * Stanford University
  7.  *
  8.  * Date:  9 November 1992
  9.  *
  10.  * Copyright: 1990, 1991 & 1992 by The Leland Stanford Junior University.
  11.  * This program may be distributed without restriction for non-commercial use.
  12.  */
  13.  
  14. #import <ctype.h>
  15. #import <appkit/appkit.h>
  16.  
  17. #import "Magnify.h"
  18. #import "MagnifyView.h"
  19. #import "DefaultsTable.h"
  20.  
  21. #define WINDOWTITLEFORMAT "%.2gx Magnification"
  22. #define WINDOWTITLEPROTOTYPE "0.00x Magnification"
  23.  
  24. #define DEFAULTSFILE "Defaults"
  25.  
  26. extern void timer(DPSTimedEntry, double, void *);
  27.  
  28. @implementation Magnify : Application
  29.  
  30. + new
  31. {
  32.     char pathnamebuf[MAXPATHLEN];
  33.  
  34.     self = [super new];
  35.  
  36.     bundle = [NXBundle bundleForClass:[self class]];
  37.     
  38.     if ([bundle getPath:pathnamebuf forResource:DEFAULTSFILE ofType:"strings"])
  39.  
  40.     [(defaults = [[DefaultsTable alloc] initFromFile:pathnamebuf]) registerDefaults:[self appName]];
  41.  
  42.     timedEntry = NULL;
  43.  
  44.     return self;
  45. }
  46.  
  47. - appDidInit:sender
  48. {    
  49.     MenuCell *cell;
  50.     NXPoint *mouse;
  51.     double scale, grid, update;
  52.     Menu *menu = [self mainMenu];
  53.     Window *window = [view window];
  54.  
  55.     scale = getFloatDefault("Scale");
  56.     
  57.     grid = getFloatDefault("GridSize");
  58.     [gridButton setIntValue:getBoolDefault("ShowGrid")];
  59.  
  60.     update = getFloatDefault("UpdateInterval");
  61.     [updateButton setIntValue:getBoolDefault("AutoUpdate")];
  62.     
  63.     [[[self showScale:scale andSlider:YES] showGrid:grid andSlider:YES] showUpdate:update andSlider:YES];
  64.         
  65.     [cursorButton setIntValue:getBoolDefault("ShowCursor")];
  66.  
  67.     [view setNextResponder:[window firstResponder]];
  68.  
  69.     [[window makeFirstResponder:view] addToEventMask:(NX_MOUSEMOVEDMASK | NX_FLAGSCHANGED)];
  70.  
  71.     if ((cell = [menu findCellWithTag:FROZENMENUCELLTAG]) != nil) {
  72.         [cell setUpdateAction:@selector(isFrozenUpdateAction:) forMenu:menu];
  73.         [menu update];
  74.         }
  75.         
  76.     [window getMouseLocation:(mouse = [view mouse])];
  77.     [window convertBaseToScreen:mouse];
  78.     [[view updateBitmap:mouse] display];
  79.     
  80.     [window makeKeyAndOrderFront:self];
  81.     
  82.     return self;
  83. }
  84.  
  85. - appWillTerminate:sender
  86. {
  87.     if([scaleSlider tag]) (void) writeDefault("Scale", [scaleField stringValue]);
  88.     
  89.     if([gridButton tag]) (void) writeBoolDefault("ShowGrid", [gridButton intValue]);
  90.     if([gridSlider tag]) (void) writeDefault("GridSize", [gridField stringValue]);
  91.     
  92.     if([updateButton tag]) (void) writeBoolDefault("AutoUpdate", [updateButton intValue]);
  93.     if([updateSlider tag]) (void) writeDefault("UpdateInterval", [updateField stringValue]);
  94.     
  95.     if([cursorButton tag]) (void) writeBoolDefault("ShowCursor", [cursorButton intValue]);
  96.  
  97.     return self;
  98. }
  99.  
  100. - hide:sender
  101. {
  102.     if (![view isFrozen]) [[view window] removeFromEventMask:NX_MOUSEMOVEDMASK];
  103.     
  104.     return [super hide:sender];
  105. }
  106.  
  107. - unhide:sender
  108. {
  109.     if (![view isFrozen]) [[view window] addToEventMask:NX_MOUSEMOVEDMASK];
  110.     
  111.     return [super unhide:sender];
  112. }
  113.  
  114. - free
  115. {
  116.     if (timedEntry != NULL) DPSRemoveTimedEntry(timedEntry);
  117.  
  118.     return [super free];
  119. }
  120.  
  121. - adjust:sender
  122. {
  123.     id slider;
  124.     float value;
  125.     int flag = ([view flags] & NX_ALTERNATEMASK);
  126.     
  127.     value = [(slider = (flag) ? gridSlider : scaleSlider) floatValue] + [[sender selectedCell] tag];
  128.     
  129.     [slider setFloatValue:MAX(MIN(value, [(Slider *) slider maxValue]), [(Slider *) slider minValue])];
  130.     
  131.     return (flag) ? [self changeGrid:slider] : [self changeScale:slider];
  132. }
  133.  
  134. - changeScale:sender
  135. {
  136.     float scale, value = rint([sender floatValue]); /* 'intValue' truncates */
  137.  
  138.     scale = (value < -1.0) ? 1.0 / (- value) : 2.0 + value; /* non-linear slider */
  139.     
  140.     [[view setScale:(scale = floor(scale * 100.0) / 100.0)] createWindows]; /* round to nearest .01 */
  141.     
  142.     [sender setTag:YES];
  143.  
  144.     return [self showScale:scale andSlider:NO];
  145. }
  146.  
  147. - showScale:(float) scale andSlider:(BOOL) flag
  148. {
  149.     char title[] = WINDOWTITLEPROTOTYPE;
  150.     
  151.     if(flag) {
  152.         float value = rint((scale < 1) ? - (1 / scale) : scale - 2.0);
  153.     
  154.         if([scaleSlider floatValue] != value) [scaleSlider setFloatValue:value];
  155.         }
  156.  
  157.     if([scaleField floatValue] != scale) [scaleField setFloatValue:scale];
  158.     
  159.     sprintf(title, WINDOWTITLEFORMAT, scale);
  160.     
  161.     [[view window] setTitle:title];
  162.  
  163.     return self;
  164. }
  165.  
  166. - changeGrid:sender
  167. {
  168.     float gridSize = rint([gridSlider floatValue]);
  169.     
  170.     [sender setTag:YES];
  171.  
  172.     [[[view setGridSize:gridSize] setShowGrid:[gridButton intValue]] display];
  173.  
  174.     return [self showGrid:gridSize andSlider:NO];
  175. }
  176.  
  177. - showGrid:(float) grid andSlider:(BOOL) flag
  178. {
  179.     [gridField setFloatValue:grid];
  180.     
  181.     if(flag && [gridSlider floatValue] != grid) [gridSlider setFloatValue:grid];
  182.  
  183.     return self;
  184. }
  185.  
  186. - changeUpdate:sender
  187. {
  188.     [sender setTag:YES];
  189.  
  190.     return [self showUpdate:rint([updateSlider floatValue] * 10.0) / 10.0 andSlider:NO]; /* round to nearest 0.1 */
  191. }
  192.  
  193. - showUpdate:(double) update andSlider:(BOOL) flag
  194. {
  195.     if (timedEntry != NULL) DPSRemoveTimedEntry(timedEntry);
  196.  
  197.     if([updateButton intValue]) timedEntry = DPSAddTimedEntry(update, (DPSTimedEntryProc) &timer, (void *) view, NX_BASETHRESHOLD);
  198.     else timedEntry = NULL;
  199.  
  200.     [updateField setFloatValue:update];
  201.     
  202.     if(flag && [updateSlider floatValue] != update) [updateSlider setFloatValue:update];
  203.         
  204.     return self;
  205. }
  206.  
  207. - toggleFrozen:sender
  208. {
  209.     [view setFrozen:![view isFrozen]];
  210.     
  211.     [[self mainMenu] update];
  212.     
  213.     return self;
  214. }
  215.  
  216. - toggleCursor:sender
  217. {
  218.     [view setShowCursor:[sender intValue]];
  219.     
  220.     [sender setTag:YES];
  221.  
  222.     return self;
  223. }
  224.  
  225. - getView { return view; }
  226. - setView:anObject { view = anObject; return self; }
  227.  
  228. - setVersion:anObject
  229. {
  230.     [(version = anObject) setStringValue:VERSION];
  231.     
  232.     return self;
  233. }
  234.  
  235. - (int) msgVersion:(const char **) aString ok:(int *) flag
  236. {
  237.     *flag = ((*aString = [version stringValue]) != NULL);
  238.  
  239.     return SEND_SUCCESS;
  240. }
  241.  
  242. - (BOOL) isFrozenUpdateAction:(MenuCell *) anObject
  243. {
  244.     BOOL flag = [[NXApp getView] isFrozen];
  245.     
  246.     if ([anObject tag] == flag) return NO;
  247.     
  248.     [[anObject setTag:(int) flag] setTitle:(flag) ? UNFROZENMENUTITLE : FROZENMENUTITLE];
  249.     [anObject setKeyEquivalent:tolower([anObject title][0])];
  250.     
  251.     return YES;
  252. }
  253.  
  254. @end
  255.